package com.woniuxy.service.impl;

import static org.mockito.Mockito.validateMockitoUsage;

import java.math.BigDecimal;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.woniuxy.dao.PrivateInfoDao;
import com.woniuxy.entity.Coach;
import com.woniuxy.entity.PrivateInfo;
import com.woniuxy.entity.Temporary;
import com.woniuxy.entity.User;
import com.woniuxy.service.CoachService;
import com.woniuxy.service.PrivateInfoService;
import com.woniuxy.service.TemporaryService;
import com.woniuxy.service.UserService;
import com.woniuxy.utils.TimeUtils;
import org.springframework.transaction.annotation.Transactional;

/**
 * 
 * <p>
 * Title: PrivateInfoServiceImpl
 * </p>
 * <p>
 * Description: 约私教通知service实现类
 * </p>
 * 
 * @author 王敞 365799712@qq.com
 * @date 2020年6月11日
 */
@Transactional
@Service
public class PrivateInfoServiceImpl implements PrivateInfoService {
	@Autowired
	private PrivateInfoDao privateInfoDao;
	@Autowired
	private CoachService coachService;
	@Autowired
	private UserService userService;
	@Autowired
	private TemporaryService temporaryService;

	/**
	 *  学生发起约私教请求
	 *  @author 王敞 365799712@qq.com
	 */
	@Override
	public int addPrivateinfo(PrivateInfo info) {
		// 先通过用户id，教练id查询，用户余额是否充足
		Coach coach = coachService.findCoachByCid(info.getCid());
		User user = userService.findUserByUid(info.getUid());
		System.out.println(coach);
		System.out.println(user);
		if (user.getMoney()==null || user.getMoney().compareTo(coach.getPrice()) == -1) {
			// 为-1 表示小于
			return -1;// 表示余额不足,提醒学员
		}
		// 查询该用户和该教练的最新一条私教通知，判断是否为正常，
		
		PrivateInfo info2 = privateInfoDao.findLastPrivateInfosByUidAndCid(info.getUid(), info.getCid());
		// 判断最新一条私教通知的情况
		if (info2 != null && info2.getPstatus().equals("2")) {
			return 2;// 表示还有未完成的私教任务
		}

		if (info2 != null && info2.getPstatus().equals("4")) {
			return 4;// 表示还有未确认支付的私教任务
		}
		// 若正常，将其作废
		if (info2 != null && info2.getPstatus().equals("1")) {
			// 将其状态改为0，即标识作废
			privateInfoDao.updatePrivateInfopstatusByPid("0", info2.getPid());
			// 同时需要将暂存款还给用户
			Temporary temporary = temporaryService.findTemporaryByPid(info2.getPid());
			BigDecimal money = user.getMoney().add(temporary.getMoney());

			// 将用户的金钱更新回去
			userService.updateUserMoneyByUidAndMoney(user.getUid(), money);
			// 将暂存记录改为已取消
			// 2表示已取消
			temporaryService.updateTemporaryTstatus(temporary.getTid(), "2");
		}
		// 再来新增新的约私教通知 设置时间
		info.setInfoTime(TimeUtils.getNowTime());
		// 执行 添加通知操作
		privateInfoDao.addPrivateinfo(info);
		// 返回最新的约私教通知
		info2 = privateInfoDao.findLastPrivateInfosByUidAndCid(info.getUid(), info.getCid());
		// 对学员账户扣除暂存费并更新
		// 为了保证学员余额是最新的，需再次查询
		User user2 = userService.findUserByUid(info.getUid());
		BigDecimal subtract = user2.getMoney().subtract(coach.getPrice());
		
		userService.updateUserMoneyByUidAndMoney(user.getUid(), subtract);
		// 添加一条暂扣款记录
		Temporary temporary = new Temporary().setMoney(coach.getPrice()).setPid(info2.getPid());
		temporaryService.addTemporary(temporary);
		return 1;// 表示成功
	}

	/**
	 * 通过id查询该约私教通知
	 *  @author 王敞 365799712@qq.com
	 * 
	 * @param pid
	 * @return
	 * @author 王敞
	 */
	@Override
	public PrivateInfo findPrivateInfoBypid(int pid) {

		return privateInfoDao.findPrivateInfoBypid(pid);
	}

	/**
	 * 通过通知id修改该通知的状态类型
	 *  
	 * 
	 * @param pstatus
	 * @param pid
	 * @return
	 * @author 王敞
	 */
	@Override
	public int updatePrivateInfopstatusByPid(String pstatus, int pid) {

		return privateInfoDao.updatePrivateInfopstatusByPid(pstatus, pid);
	}

	@Override
	public int updatePrivateInfoOid(int pid, int oid) {
		return privateInfoDao.updatePrivateInfoOid(pid, oid);
	}

	@Override
	public int addPrivateinfo2(PrivateInfo info) {
		return privateInfoDao.addPrivateinfo2(info);
	}

	@Override
	public PrivateInfo findLastPrivateInfosByUidAndCid(int uid, int cid) {
		return privateInfoDao.findLastPrivateInfosByUidAndCid(uid, cid);
	}

	@Override
	public List<PrivateInfo> findPrivateInfosByUid(int uid) {
		return privateInfoDao.findPrivateInfosByUid(uid);
	}

	@Override
	public List<PrivateInfo> findPrivateInfosByCid(int cid) {
		return privateInfoDao.findPrivateInfosByCid(cid);
	}

}
